import unittest
import requests
from parameterized import parameterized

from api.openAccountApi import OpenAccountApi
from api.rechargeApi import RechargeApi
from api.regLoginApi import RegLoginApi
from api.tenderApi import TenderApi
from common import utils
from common.utils import init_tender_info


class TestTender(unittest.TestCase):

    @classmethod
    def setUpClass(cls) -> None:
        # 借款标测试数据初始化
        init_tender_info()

    def setUp(self) -> None:
        # 创建session对象
        self.session = requests.session()
        # 调用投资模块类
        self.tender_api = TenderApi(self.session)
        # 调用登录模块类
        self.reg_login_api = RegLoginApi(self.session)
        # 调用充值模块类
        self.recharge_api = RechargeApi(self.session)
        # 调用开户模块类
        self.open_account_api = OpenAccountApi(self.session)

    def tearDown(self) -> None:
        # 关闭session对象
        self.session.close()

    # 投资测试用例
    @parameterized.expand(utils.read_json("tender_data", "tender"))
    def test01_tender(self, phone, pwd, id, amount, exp_status_code, exp_status, exp_desp, case_name):
        # 用户登录
        self.reg_login_api.user_login(phone, pwd)
        # 投资
        res = self.tender_api.tender(id, amount)

        # 断言
        utils.common_assert(self, res, exp_status_code, exp_status, exp_desp, case_name)

    # 第三方投资测试用例
    def test02_third_tender(self):
        # 用户登录
        self.reg_login_api.user_login("15814662511", "123321")
        # 投资
        res_tender = self.tender_api.tender(642, 500)

        request_data = utils.html_util(res_tender)
        # 调用封装获取第三方接口请求数据的方法，获取第三方充值接口的url
        url = request_data[0]
        # 调用封装获取第三方接口请求数据的方法，获取第三方充值接口的请求体数据
        form_dict = request_data[1]
        # 调用封装的第三方充值接口的方法，获取第三方接口返回的响应结果
        res_3_tender = self.tender_api.third_tender(url, form_dict)

        # 断言
        # 断言状态码
        self.assertEqual(200, res_3_tender.status_code)
        # 断言响应体数据
        self.assertIn("OK", res_3_tender.text)

    # 投资业务流程
    def test03_tender_process(self):
        # 将使用的数据，设置为变量，方便进行统一管理
        r = 12333333333
        exp_status_code = 200
        phone = "15814662520"
        imgVerifyCode = "8888"
        exp_status = 200
        exp_description = "成功"
        exp_description2 = "form"
        exp_third_description = "OK"
        password = "123321"
        phoneVerifyCode = "666666"
        realname = "赵老四"
        card_id = "632323190605260500"
        recharge_amount = "50000"
        id = 642
        tender_amount = 500

        # 1.图片验证码接口
        # 通过调用封装的图片验证码接口的方法，获取响应结果
        res_1 = self.reg_login_api.get_img_verify_code(r)
        # 断言状态码
        self.assertEqual(exp_status_code, res_1.status_code)

        # 2.获取短信验证码接口
        # 通过调用封装的短信验证码接口的方法，获取响应结果
        res_2 = self.reg_login_api.get_phone_verify_code(phone, imgVerifyCode)
        # 断言-通用断言
        utils.common_assert(self, res_2, exp_status_code, exp_status, exp_description)

        # 3.注册接口
        # 通过调用封装的注册接口的方法，获取响应结果
        res_3 = self.reg_login_api.user_register(phone, password, imgVerifyCode, phoneVerifyCode)
        # 断言-通用断言
        utils.common_assert(self, res_3, exp_status_code, exp_status, exp_description)

        # 4.登录接口
        # 通过调用封装的登录接口的方法，获取响应结果
        res_4 = self.reg_login_api.user_login(phone, password)
        # 断言-通用断言
        utils.common_assert(self, res_4, exp_status_code, exp_status, exp_description)

        # 5.实名认证接口
        # 通过调用封装的实名认证接口的方法，获取响应结果
        res_5 = self.open_account_api.realname(realname, card_id)
        # 断言-通用断言
        utils.common_assert(self, res_5, exp_status_code, exp_status, exp_description)
        # 实名认证信息断言
        self.assertEqual("632****500", res_5.json().get("data").get("card_id"))
        self.assertEqual("赵**", res_5.json().get("data").get("realname"))

        # 6.开户接口
        # 通过调用封装的开户接口的方法，获取响应结果
        res_6 = self.open_account_api.open_account()
        # 断言-通用断言
        utils.common_assert(self, res_6, exp_status_code, exp_status, exp_description2)

        # 7.第三方开户接口
        # 通过调用封装的获取第三方接口请求数据的方法，获取第三方开户接口的url和请求体数据
        request_data_3_open_account = utils.html_util(res_6)
        url_3_open_account = request_data_3_open_account[0]
        form_3_open_account = request_data_3_open_account[1]
        # 通过调用封装的第三方开户接口的方法，传入url和请求体数据，获取响应结果
        res_7 = self.open_account_api.third_open_account(url_3_open_account, form_3_open_account)
        # 断言状态码
        self.assertEqual(exp_status_code, res_7.status_code)
        # 断言响应体数据
        self.assertIn(exp_third_description, res_7.text)

        # 8.获取充值验证码接口
        # 通过调用封装的获取充值验证码接口的方法，获取响应结果
        res_8 = self.recharge_api.get_recharge_verify_code(r)
        # 断言状态码
        self.assertEqual(exp_status_code, res_8.status_code)

        # 9.充值接口
        # 通过调用封装的充值接口的方法，获取响应结果
        res_9 = self.recharge_api.recharge(recharge_amount, imgVerifyCode)
        # 断言-通用断言
        utils.common_assert(self, res_9, exp_status_code, exp_status, exp_description2)

        # 10.第三方充值接口
        # 通过调用封装的获取第三方接口请求数据的方法，获取第三方开户接口的url和请求体数据
        request_data_3_recharge = utils.html_util(res_9)
        url_3_recharge = request_data_3_recharge[0]
        form_3_recharge = request_data_3_recharge[1]
        # 通过调用封装的第三方充值接口的方法，传入url和请求体数据，获取响应结果
        res_10 = self.recharge_api.third_recharge(url_3_recharge, form_3_recharge)
        # 断言状态码
        self.assertEqual(exp_status_code, res_10.status_code)
        # 断言响应体数据
        self.assertIn(exp_third_description, res_10.text)

        # 11.投资接口
        # 通过调用封装的投资接口的方法，获取响应结果
        res_11 = self.tender_api.tender(id, tender_amount)
        # 断言-通用断言
        utils.common_assert(self, res_11, exp_status_code, exp_status, exp_description2)

        # 12.第三方投资接口
        # 通过调用封装的获取第三方接口请求数据的方法，获取第三方开户接口的url和请求体数据
        request_data_3_tender = utils.html_util(res_11)
        url_3_tender = request_data_3_tender[0]
        form_3_tender = request_data_3_tender[1]
        # 通过调用封装的第三方投资接口的方法，传入url和请求体数据，获取响应结果
        res_12 = self.tender_api.third_tender(url_3_tender, form_3_tender)
        # 断言状态码
        self.assertEqual(exp_status_code, res_12.status_code)
        # 断言响应体数据
        self.assertIn(exp_third_description, res_12.text)
